package com.yuntsg.nnsfcp.service.front.ut;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;

/**
 * 中文名字 转拼音
 *
 * @author ljx
 * @date 2019/6/2
 */
public class PinYinUtil {

    /**
     * 存储最终结果
     */
    protected static String str = null;


    /**
     * 判断当前的字符串 是否是中文
     *
     * @param p 字符串
     * @return 是中文返回true
     */
    public static boolean isChinese(String p) {
        byte[] bytes = p.getBytes();
        //i为<字节>长度
        int i = bytes.length;
        //j为<字符>长度
        int j = p.length();
        if (i == j) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 将中文转换为英文 , (没有多音)
     *
     * @param name 中文名
     * @return
     * @throws Exception
     */
    private static String getEname(String name) throws Exception {
        HanyuPinyinOutputFormat pyFormat = new HanyuPinyinOutputFormat();
        pyFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        pyFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        pyFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
        return PinyinHelper.toHanyuPinyinString(name, pyFormat, "");
    }

    /**
     * 判断名字长度,调用对应方法
     *
     * @param name 中文名
     * @return
     * @throws Exception
     * @deprecated 此方法不提供多音字, 有更好的方法所替代
     * {@link PinYinManyUtil}
     */
    @Deprecated
    public static String getPinY(String name) throws Exception {
        char[] strs = name.toCharArray();
        //名字的长度
        int nameLengthTwo = 2;
        int nameLengthThree = 3;
        int nameLengthFour = 4;

        if (strs.length == nameLengthTwo) {
            //返回2个字名字结果
            getTwoNames(name);
        } else if (strs.length == nameLengthThree) {
            //返回3个字的名字结果
            getThreeNames(name);
        } else if (strs.length == nameLengthFour) {
            //返回4个字的结果
            getFourNames(name);
        } else {
            throw new Exception("名字长度不合法");
        }
        return str;
    }

    /**
     * 首字母大写
     *
     * @param str 英文
     * @return
     */
    protected static String toUpCase(String str) {
        StringBuffer newstr = new StringBuffer();
        newstr.append((str.substring(0, 1)).toUpperCase()).append(
                str.substring(1, str.length()));
        return newstr.toString();
    }

    /**
     * 获取2个名字的多种格式
     *
     * @param cnName 中文名
     * @return
     * @throws Exception
     */
    private static void getTwoNames(String cnName) throws Exception {
        StringBuffer buff = new StringBuffer();
        //中文拆分为单个字
        char[] strs = cnName.toCharArray();
        //转换为拼音  Hu,Ge
        String newName = toUpCase(getEname("" + strs[0])) + ", "
                + toUpCase(getEname("" + strs[1]));
        //Hu Ge
        String[] splits = newName.split(", ");

        //1 Hu,Ge
        buff.append(newName).append(";");

        //2 Ge, Hu;
        buff.append(splits[1]).append(", ").append(splits[0]).append(";");

        //3 Hu,G;
        buff.append(splits[0]).append(", ").append(splits[1].substring(0, 1)).append(";");

        //4 G, Hu;
        buff.append(splits[1].substring(0, 1)).append(", ").append(splits[0]).append(";");

        //5 Hu,G.;
        buff.append(splits[0]).append(", ").append(splits[1].substring(0, 1)).append(".").append(";");

        // Hu Ge;
        buff.append(splits[0]).append(" ").append(splits[1]).append(";");

        // Hu-Ge;
        buff.append(splits[0]).append("-").append(splits[1]).append(";");

        // Ge Hu;
        buff.append(splits[1]).append(" ").append(splits[0]).append(";");

        // Hu G;
        buff.append(splits[0]).append(" ").append(splits[1].substring(0, 1)).append(";");

        // G Hu;
        buff.append(splits[1].substring(0, 1)).append(" ").append(splits[0]).append(";");

        //14 胡歌
        buff.append(cnName);
        str = buff.toString();
    }

    /**
     * 获取3个字名字的多种格式
     *
     * @param cnName 中文名
     * @return
     */
    private static void getThreeNames(String cnName) throws Exception {
        StringBuffer buff = new StringBuffer();
        //将名字分为单个字且全部首字母大写 Li Yu Chun
        char[] strs = cnName.toCharArray();
        String newName = toUpCase(getEname("" + strs[0])) + ", "
                + toUpCase(getEname("" + strs[1])) + ", "
                + toUpCase(getEname("" + strs[2]));
        String[] splits = newName.split(", ");

        //将名字分为 两个分段, Li, Yuchun
        String newName2 = toUpCase(getEname("" + strs[0])) + ", "
                + toUpCase(getEname("" + strs[1] + strs[2]));
        String[] pinYin1 = newName2.split(", ");

        //1 Li,Yuchun
        buff.append(newName2).append(";");

        //2 Li Yuchun
        buff.append(pinYin1[0]).append(" ").append(pinYin1[1]).append(";");

        //3 Yuchun,Li
        buff.append(pinYin1[1]).append(", ").append(pinYin1[0]).append(";");

        //4 YuChun Li
        buff.append(pinYin1[1]).append(" ").append(pinYin1[0]).append(";");

        //5 Yu-Chun,Li
        buff.append(splits[2]).append("-").append(splits[1]).append(", ").append(splits[0]).append(";");

        //6 Li,Yu-Chun;
        buff.append(splits[0]).append(", ").append(splits[1]).append("-").append(splits[2]).append(";");

        //7 Li Yu-Chun;
        buff.append(splits[0]).append(" ").append(splits[1]).append("-").append(splits[2]).append(";");

        //8 Yu-Chun Li;
        buff.append(splits[2]).append("-").append(splits[1]).append(" ").append(splits[0]).append(";");

        //9 Li,Y.C.;
        buff.append(splits[0]).append(", ").append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append(".").append(";");

        //15 Li Y.C.;
        buff.append(splits[0]).append(" ").append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append(".").append(";");

        //18 Li Y-C;
        buff.append(splits[0]).append(" ").append(splits[1].substring(0, 1)).append("-").append(splits[2].substring(0, 1)).append(";");

        //19 Li, Y-C;
        buff.append(splits[0]).append(", ").append(splits[1].substring(0, 1)).append("-").append(splits[2].substring(0, 1)).append(";");

        //16 Li Y.C;
        buff.append(splits[0]).append(" ").append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append(";");

        //17 Li, Y.C;
        buff.append(splits[0]).append(", ").append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append(";");

        //10 Li YC;
        buff.append(splits[0]).append(" ").append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(";");

        //11 Li,YC
        buff.append(splits[0]).append(",").append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(";");

        //12 YC Li;
        buff.append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(" ").append(splits[0]).append(";");

        // Y-C Li;
        buff.append(splits[1].substring(0, 1)).append("-").append(splits[2].substring(0, 1)).append(" ").append(splits[0]).append(";");

        // Y-C, Li;
        buff.append(splits[1].substring(0, 1)).append("-").append(splits[2].substring(0, 1)).append(", ").append(splits[0]).append(";");

        //13 YC,Li;
        buff.append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(", ").append(splits[0]).append(";");

        // Y.C,Li;
        buff.append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append(", ").append(splits[0]).append(";");

        // Y.C. Li;
        buff.append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append(". ").append(splits[0]).append(";");

        // Y.C Li;
        buff.append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append(" ").append(splits[0]).append(";");

        // Y.C., Li;
        buff.append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append("., ").append(splits[0]).append(";");

        //14 李宇春
        buff.append(cnName);
        str = buff.toString();
    }

    /**
     * 获取4个字名字的多种格式
     *
     * @param cnName 中文名
     * @return
     * @throws Exception
     */
    private static void getFourNames(String cnName) throws Exception {
        StringBuffer buff = new StringBuffer();
        //将名字分为单个字且全部首字母大写 Di Li Re Ba
        char[] strs = cnName.toCharArray();
        String newName = toUpCase(getEname("" + strs[0])) + ", "
                + toUpCase(getEname("" + strs[1])) + ", "
                + toUpCase(getEname("" + strs[2])) + ", "
                + toUpCase(getEname("" + strs[3]));
        String[] splits = newName.split(", ");

        //将名字分为 两个分段, Di Lireba
        String newName2 = toUpCase(getEname("" + strs[0])) + ", "
                + toUpCase(getEname("" + strs[1] + strs[2] + strs[3]));
        String[] pinYin1 = newName2.split(", ");

        //Di，Lireba；
        buff.append(newName2).append(";");

        // Lireba，Di；
        buff.append(pinYin1[1]).append(", ").append(pinYin1[0]).append(";");

        // Di，Li-Re-Ba；
        buff.append(splits[0]).append(", ").append(splits[1]).append("-").append(splits[2]).append("-").append(splits[3]).append(";");

        // Li-Re-Ba，Di；
        buff.append(splits[1]).append("-").append(splits[2]).append("-").append(splits[3]).append(", ").append(splits[0]).append(";");

        // Di，LRB；
        buff.append(splits[0]).append(", ").append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(splits[3].substring(0, 1)).append(";");

        // LRB，Di；
        buff.append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(splits[3].substring(0, 1)).append(", ").append(splits[0]).append(";");

        // Di，L.R.B.；
        buff.append(splits[0]).append(", ").append(splits[1].substring(0, 1)).append(".").append(splits[2].substring(0, 1)).append(".").append(splits[3].substring(0, 1)).append(".").append(";");

        // Di Lireba；
        buff.append(pinYin1[0]).append(" ").append(pinYin1[1]).append(";");

        // Lireba Di；
        buff.append(pinYin1[1]).append(" ").append(pinYin1[0]).append(";");

        // Di Li-Re-Ba；
        buff.append(splits[0]).append(" ").append(splits[1]).append("-").append(splits[2]).append("-").append(splits[3]).append(";");

        // Li-Re-Ba Di；
        buff.append(splits[1]).append("-").append(splits[2]).append("-").append(splits[3]).append(" ").append(splits[0]).append(";");

        // Di LRB；
        buff.append(splits[0]).append(" ").append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(splits[3].substring(0, 1)).append(";");

        // Di,LRB
        buff.append(splits[0]).append(",").append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(splits[3].substring(0, 1)).append(";");

        // LRB Di；
        buff.append(splits[1].substring(0, 1)).append(splits[2].substring(0, 1)).append(splits[3].substring(0, 1)).append(" ").append(splits[0]).append(";");

        // 迪丽热巴
        buff.append(cnName);
        str = buff.toString();
    }

    /**
     * 字符串中文名 ; 间隔 批量转换(现在只有两种格式)
     *
     * @param str 字符串 ; 间隔 批量转换
     * @return
     * @throws Exception
     */
    public static String getEnName(String str) {
        StringBuffer buff = new StringBuffer();
        if (str != null) {
            try {
                String[] cn = str.split(";");
                for (int i = 0; i < cn.length; i++) {
                    String s = cn[i];
                    //将名字分为单个字且全部首字母大写 Li Yu Chun
                    char[] strs = s.toCharArray();
                    if (strs.length == 3) {
                        //Li Yuchun
                        String newName1 = toUpCase(getEname("" + strs[0])) + " "
                                + toUpCase(getEname("" + strs[1] + strs[2]));
                        //Li-Yuchun
                        String newName2 = toUpCase(getEname("" + strs[0])) + "-"
                                + toUpCase(getEname("" + strs[1] + strs[2]));

                        buff.append(newName1).append(";").append(newName2).append(";");
                    } else {
                        //Hu Ge
                        String newName = toUpCase(getEname("" + strs[0])) + " "
                                + toUpCase(getEname("" + strs[1]));
                        //Hu-Ge
                        String newName1 = toUpCase(getEname("" + strs[0])) + "-"
                                + toUpCase(getEname("" + strs[1]));

                        buff.append(newName).append(";").append(newName1).append(";");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return buff.toString();
    }

}
